home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 January / macformat46.iso / Demos / PowerFantasm 4.15 / Beginners guide / GUIDE EXAMPLES / EXAMPLE10.S < prev    next >
Encoding:
Text File  |  1996-06-21  |  3.6 KB  |  103 lines

  1. ********************************************************************************
  2. *EXAMPLE 10 - draw a multi coloured box using draw_h_line                      *
  3. *AUTHOR    - STUART BALL JULY 94                                               *
  4. *SCREEN MUST BE SET TO 256 COLOUR MODE FOR THIS EXAMPLE                        *
  5. ********************************************************************************
  6. SCREENROW:    EQU    $0106    WIDTH OF EACH SCREEN LINE
  7. DEVICELIST:    EQU    $08A8    THE ADDRESS OF DEVICELIST
  8. gdPMap_offset:    EQU    22
  9. EXAMPLE10:    MOVEM.L    A5-A6,-(SP)    SAVE MAC WORLD
  10.     BSR    INIT    INITIALISE OUR VARIABLES
  11.     BSR    CLS    CLEAR THE SCREEN
  12.     BSR    DRAW_MULTI_BOX    DRAW MULTI COLOURED BOX
  13.     MOVEM.L    (SP)+,A5-A6    RESTORE MAC WORLD
  14.     RTS
  15. ************************END OF EXAMPLE 10***************************************
  16.  
  17. **INIT SETS UP OUR VARIABLES
  18. INIT:    LEA    MY_VARS(PC),A6    A6 IS OUR VARIABLE POINTER
  19.     MOVE.L    DEVICELIST,A0
  20.     MOVE.L    (A0),A0    POINT TO DEVICELIST
  21.     MOVE.L    A0,A1    COPY ADDRESS OF DEVICE LIST
  22.     MOVE.L    gdPMap_offset(A1),A1    A1=POINTER TO GDPMAP
  23.     MOVE.L    (A1),A1        gdPMap IN A1
  24.     MOVE.W    10(A1),NUMB_OF_LINES(A6)    SAVE NUMBER OF LINES
  25.     MOVE.L    (A1),VRAM_ADDR(A6)    SAVE VRAM ABSOLUTE ADDRESS
  26.     RTS
  27.     
  28. **CLS CLEARS THE MAC SCREEN TOTALLY
  29. **PRESERVES ALL REGISTERS
  30. CLS:    MOVEM.L    D0-D2/A1,-(SP)    SAVE REGS
  31.     
  32.     CLR.L    D0
  33.     CLR.L    D1
  34.     CLR.L    D2
  35.     
  36.     MOVE.L    VRAM_ADDR(A6),A1    VRAM ADDRESS IN A1
  37.     MOVE.W    NUMB_OF_LINES(A6),D0    NUMBER OF LINES ON SCREEN
  38.     SUBQ.W    #1,D0    DBcc ALWAYS LOOPS ONE MORE THAN THE COUNT
  39.     MOVE.W    SCREENROW,D1    WIDTH IN BYTES OF EACH LINE
  40.     LSR.W    #2,D1    DIVIDE BY FOUR AS WERE CLEARING LONGS
  41.     SUBQ.W    #1,D1    DBRA ALWAYS LOOPS 1 MORE THAN THE COUNT!
  42.     MOVE.W    D1,D2    SAVE SIZE OF LINE(IN BYTES)
  43.  
  44. NEXT_LINE:
  45. CLEAR_LINE:    CLR.L    (A1)+    CLEAR THIS BYTE OF VRAM AND POINT TO NEXT
  46.     DBRA    D1,CLEAR_LINE    CLEAR THIS LINE
  47.     MOVE.W    D2,D1    RESET BYTES/LINE COUNTER
  48.     DBRA    D0,NEXT_LINE    CLEAR NEXT LINE
  49.     
  50.     MOVEM.L    (SP)+,D0-D2/A1    RESTORE REGS
  51.     RTS
  52.  
  53. **draw_multi_box uses draw_h_line to draw a box 255 by 255 in 255 colours!
  54. **needs no parameters
  55. DRAW_MULTI_BOX:    MOVE.L    #255,D2    STARTING COLOUR
  56.     MOVE.L    #200,D0    START X COORD OF LINE
  57.     MOVE.L    #455,D3    END X COORDINATE OF LINE
  58.  
  59. DRAW_BOX:    MOVE.L    D2,D1    Y COORDINATE OF LINE - SAME AS COLOUR
  60.     ADD.L    #100,D1    OFFSET Y COORD DOWN 100 PIXELS
  61.     BSR.S    DRAW_H_LINE    DRAW A HORIZONTAL LINE
  62.     DBRA    D2,DRAW_BOX    DEC COLOUR, AND LOOP IF NOT ZERO
  63.     RTS
  64.     
  65. **DRAW_H_LINE DRAWS A HORIZONTAL LINE.
  66. **NEEDS START X COORDINATE IN D0
  67. **            Y COORDINATE IN D1
  68. **            LINE COLOUR IN D2
  69. **        END X COORDINATE IN D3
  70. DRAW_H_LINE:    MOVE.L    D0,-(SP)    SAVE START COORDINATE
  71.     MOVE.L    VRAM_ADDR(A6),A1    FOR PLOT
  72. DHL_LOOP:    BSR.S    PLOT    PLOT THIS PIXEL
  73.     ADD.W    #1,D0    INC X COORDINATE
  74.     CMP.W    D3,D0    COMPARE WITH END COORDINATE
  75.     BNE.S    DHL_LOOP    IF NOT THERE YET, DRAW NEXT PIXEL
  76.     MOVE.L    (SP)+,D0    RESTORE START COORDINATE
  77.     RTS
  78.  
  79. **PLOT IS A SUBROUTINE THATS PLOTS A PIXEL ON THE SCREEN IN THE COLOUR HELD IN D2
  80. **NEEDS D0.W = X COORDINATE
  81. **      D1.W = Y COORDINATE
  82. **      D2.B = THE COLOUR
  83. **      A1   = VRAM BASE ADDRESS
  84. **ALL REGISTERS REMAIN UNAFFECTED
  85. PLOT:    MOVEM.L    D0-D3/A1,-(SP)    SAVE THE REGISTERS WE USE
  86.     CLR.L    D3
  87.     MOVE.W    SCREENROW,D3    GET PHYSICAL LENGTH OF EACH SCREEN LINE
  88.     MULS    D3,D1    Y COORDINATE TIMES THE LENGTH OF EACH LINE
  89.     ADD.L    D0,D1    VRAM ADDRESS OF THIS PIXEL
  90.     ADD.L    D1,A1    ABSOLUTE ADDRESS OF THIS PIXEL
  91.     MOVE.B    D2,(A1)    SET THE PIXEL TO THE COLOUR IN D2
  92.     MOVEM.L    (SP)+,D0-D3/A1    RESTORE THE REGS TO HOW THEY WERE
  93.     RTS        END OF SUBROUTINE PLOT
  94.     
  95.  
  96. *********************************VARIABLES FOLLOW********************************
  97.  
  98. MY_VARS:    DS.B    20    SPACE FOR OUR VARIABLES
  99.  
  100. ******************************OFFSETS INTO VARIABLES*****************************
  101.  
  102. NUMB_OF_LINES:    EQU    0    .W NUMBER OF PHYSICAL LINES ON SCREEN    
  103. VRAM_ADDR:        EQU    2    .L ABSOLUTE ADDRESS OF VRAM